package com.llb666.java.leetcode;

/**
 * 存在一个长度为 n 的数组 arr ，其中 arr[i] = (2 * i) + 1 （ 0 <= i < n ）。
 * 一次操作中，你可以选出两个下标，记作 x 和 y （ 0 <= x, y < n ）并使 arr[x] 减去 1 、
 * arr[y] 加上 1 （即 arr[x] -=1 且 arr[y] += 1 ）。最终的目标是使数组中的所有元素都 相等 。
 * 题目测试用例将会 保证 ：在执行若干步操作后，数组中的所有元素最终可以全部相等。
 * 给你一个整数 n，即数组的长度。请你返回使数组 arr 中所有元素相等所需的 最小操作数 。
 * @author 斌~
 * @version 1.0
 * @date 2021/3/10 11:33 下午
 */
public class LeetCode1551 {
    public static void main(String[] args) {
        System.out.println(minOperations(4));
    }
    /**
     * 最少操作次数是前若干个偶数或者奇数的和——取决于n的奇偶性。本质是“等差数列的”中间项.
     * arr[5]={1 3 5 7 9} -->奇数 n=5个数值 7变成5操作2次 9变成5操作4次
     * arr[4]={1 3 5 7 } --> 1+3 3+1 5-1 7-3   1+3等于4次
     * n 是奇数 （n+1）*(n-1)/4
     * n 是偶数  n*n/4
     * @param n  数组的长度
     * @return 最小操作数
     */
    private static int minOperations(int n) {
        return (n * n - (n & 1)) >> 2;
    }
}
